


////物模型更新到 <<交流电表物模型-v1.4>>


//#include  "iotv30_config.h"


#include "cjson_api_readAttr.h"
#include "iot_node_func.h"
#include "iotv30_config.h"
#include "test_mode.h"
// #include "iot_node.h"

#include "uart_printf.h"
#include <string.h>

#include "dev_ac_meter.h"


// 能测量交流电的数据项有：A相电压、B相电压、C相电压、A相电流、B相电流、
// C相电流、A相有功功率、B相有功功率、C相有功功率、A相功率因数、B相功率因数、
// C相功率因数、总电量、总有功功率、总功率因数、频率

////物模型更新到 <<交流电表物模型-v1.4>>
////注意：改变 数组 ac_meter_iot_id_table[ac_meter_index_end]的定义-----需要同步更新  枚举变量的定义 ac_meter_attr_index_e-------
const  uint16_t  ac_meter_iot_id_table[ac_meter_index_end]=
{
    //iot_id(hex)	,	name	R/W	变化上报	分类	数据类型	范围	单位	默认值		
    //	运行参数					
    0x0400	,//	1024	rptVoltA	A相电压	RO	否	运行参数	uint16_t		0.1V
    0x0401	,//	1025	rptVoltB	B相电压	RO	否	运行参数	uint16_t		0.1V
    0x0402	,//	1026	rptVoltC	C相电压	RO	否	运行参数	uint16_t		0.1V
    0x0403	,//	1027	rptCurrA	A相电流	RO	否	运行参数	uint16_t		0.01A
    0x0404	,//	1028	rptCurrB	B相电流	RO	否	运行参数	uint16_t		0.01A
    0x0405	,//	1029	rptCurrC	C相电流	RO	否	运行参数	uint16_t		0.01A
 //   0x0407	,//	1031	rptRestCurr	漏电电流	RO	否	运行参数	uint16_t		1mA
    0x0408	,//	1032	rptFreq	频率	RO	否	运行参数	uint16_t		0.1Hz
    0x0409	,//	1033	rptActPwrT	总有功功率	RO	否	运行参数	uint32_t		1W
    0x040A	,//	1034	rptPfT	总功率因数	RO	否	运行参数	uint8_t	0~100	
    0x040B	,//	1035	rptActEngiT	总有功电能	R/W	否	运行参数	uint32_t		0.01kWh
    0x040C	,//	1036	rptActPwrA	A相有功功率	RO	否	运行参数	uint16_t		1W
    0x040D	,//	1037	rptActPwrB	B相有功功率	RO	否	运行参数	uint16_t		1W
    0x040E	,//	1038	rptActPwrC	C相有功功率	RO	否	运行参数	uint16_t		1W
    0x040F	,//	1039	rptPfA	A相功率因数	RO	否	运行参数	uint8_t	0~100	
    0x0410	,//	1040	rptPfB	B相功率因数	RO	否	运行参数	uint8_t	0~100	
    0x0411	,//	1041	rptPfC	C相功率因数	RO	否	运行参数	uint8_t	0~100	
   //  0x0412	,//	1042	rptActEngiA	A相有功电能	R/W	否	运行参数	uint32_t		0.01kWh
   //  0x0413	,//	1043	rptActEngiB	B相有功电能	R/W	否	运行参数	uint32_t		0.01kWh
   //  0x0414	,//	1044	rptActEngiC	C相有功电能	R/W	否	运行参数	uint32_t		0.01kWh
    
   0x0421	, // 1057	报警信息"0=正常，1=告警

   0x0541,//1345-- DI	RO		运行参数	uint32_t	

    0x0010	,//do1 R/W 运行参数	bool------这个也需要主动上报
    0x0011	,//do2 R/W 运行参数	bool----这个也需要主动上报

                                
        //配置参数	
    0x0440	,//电能脉冲常数pulseConst	R/W	否		配置信息	uint16_t		
    0x0441	,//报警使能 almEn	R/W		配置信息	uint16_t		
    0x0442	,//电压变比PT	R/W		配置信息	uint16_t		
    0x0443	,//电流变比CT	R/W		配置信息	uint16_t		                    
    

////物模型更新到 <<交流电表物模型-v1.4>>
   0x0470 ,//1136	thVoltHi	电压高阈值	R/W	否	配置信息	uint16_t		0.1V
   0x0471 ,//1137	thVoltLow	电压低阈值	R/W	否	配置信息	uint16_t		0.1V
   0x0472 ,//1138	thFreqHi	过频率阈值	R/W	否	配置信息	uint16_t		0.1Hz
   0x0473 ,//1139	thFreqLow	欠频率阈值	R/W	否	配置信息	uint16_t		0.1Hz
   0x0474 ,//1140	thPowerHi	过功率阈值	R/W	否	配置信息	uint16_t		1W
   0x0475 ,//1141	thPowerLow	欠功率阈值	R/W	否	配置信息	uint16_t		1W
   0x0476 ,//1142	thCurrHi	过电流阈值	R/W	否	配置信息	uint16_t		0.01A
   0x0477 ,//1143	thCurrLow	欠电流阈值	R/W	否	配置信息	uint16_t		0.01A


   0x0600	,//	液位设备地址	R/W	否	配置参数	uint8_t	0~255	
   0x0602	,//	液位设备通道编号	R/W	否	配置参数	uint8_t	0~31	


    //产品信息						
    0x0801	,//	软件版本	RO	否	软件版本	string	最大32字节	
    0x0802	,//	硬件版本	RO	否	硬件版本	string	最大32字节	
    0x0803	,//	产品型号	RO	否	产品型号	string	最大32字节	
    0x0804	,//	生产信息	RO	否	生产信息	string	最大32字节	
    0x0805	,//	厂家信息	RO	否		string	最大32字节	

};




/*-----------------------------------------------------------------------------------------------------

////注意：改变 数组 ac_meter_iot_id_table[ac_meter_index_end]的定义-----需要同步更新  枚举变量的定义 ac_meter_attr_index_e-------
const static uint16_t  ac_meter_iot_id_table[ac_meter_index_end]=
{
    //iot_id(hex)	,	name	R/W	变化上报	分类	数据类型	范围	单位	默认值		
    //	运行参数					
    0x0400	,//A相电压	RO	否	运行参数	uint16_t		0.1V
    0x0401	,//B相电压	RO	否	运行参数	uint16_t		0.1V
    0x0402	,//C相电压	RO	否	运行参数	uint16_t		0.1V
    0x0403	,//A相电流	RO	否	运行参数	uint16_t		0.01A
    0x0404	,//B相电流	RO	否	运行参数	uint16_t		0.01A
    0x0405	,//C相电流	RO	否	运行参数	uint16_t		0.01A
    0x0407	,//漏电电流	RO	否	运行参数	uint16_t		1mA
    0x0408	,//频率	RO	否	运行参数	uint16_t		0.1Hz
    0x0409	,//总有功功率	RO	否	运行参数	uint32_t		1W
    0x040A	,//总功率因数	RO	否	运行参数	uint8_t	0~100	
    0x040B	,//总有功电能	R/W	否	运行参数	uint32_t		0.01kWh
    0x040C	,//A相有功功率	RO	否	运行参数	uint16_t		1W
    0x040D	,//B相有功功率	RO	否	运行参数	uint16_t		1W
    0x040E	,//C相有功功率	RO	否	运行参数	uint16_t		1W
    0x040F	,//A相功率因数	RO	否	运行参数	uint8_t	0~100	
    0x0410	,//B相功率因数	RO	否	运行参数	uint8_t	0~100	
    0x0411	,//C相功率因数	RO	否	运行参数	uint8_t	0~100	
    0x0412	,//A相有功电能	R/W	否	运行参数	uint32_t		0.01kWh
    0x0413	,//B相有功电能	R/W	否	运行参数	uint32_t		0.01kWh
    0x0414	,//C相有功电能	R/W	否	运行参数	uint32_t		0.01kWh
                
    0x0415	,//线电压UAB	RO	否	运行参数	uint16_t		0.1V
    0x0416	,//线电压UBC	RO	否	运行参数	uint16_t		0.1V
    0x0417	,//线电压UAC	RO	否	运行参数	uint16_t		0.1V
    0x0418	,//A相无功功率	RO	否	运行参数	uint16_t		var
    0x0419	,//B相无功功率	RO	否	运行参数	uint16_t		var
    0x041A	,//C相无功功率	RO	否	运行参数	uint16_t		var
    0x041B	,//总无功功率	RO	否	运行参数	uint16_t		var
    0x041C	,//A相视在功率	RO	否	运行参数	uint16_t		VA
    0x041D	,//B相视在功率	RO	否	运行参数	uint16_t		VA
    0x041E	,//C相视在功率	RO	否	运行参数	uint16_t		VA
    0x041F	,//总视在功率	RO	否	运行参数	uint16_t		VA		
    0x0420	,//总无功电能	R/W	否	运行参数	uint32_t		0.01kWh
                    
    0x0421	,//DI	RO		运行参数	uint16_t		
    0x0422	,//DO	R/W		运行参数	uint16_t		
                                                                
    0x0600	,//	液位设备地址	R/W	否	配置参数	uint8_t	0~255	
    0x0602	,//	液位设备通道编号	R/W	否	配置参数	uint8_t	0~31	


    //产品信息						
    0x0801	,//	软件版本	RO	否	软件版本	string	最大32字节	
    0x0802	,//	硬件版本	RO	否	硬件版本	string	最大32字节	
    0x0803	,//	产品型号	RO	否	产品型号	string	最大32字节	
    0x0804	,//	生产信息	RO	否	生产信息	string	最大32字节	
    0x0805	,//	厂家信息	RO	否		string	最大32字节	

};


-----------------------------------------------------------------------------------------------------*/

 static ac_meter_attr_t ac_meter_obj[AC_METER_NODE_NUM_MAX];   /////下标与 配置节点数据结构一一对应 iot_NodeConfigObj_u   iot_NodeConfigObj;


static  ac_meter_attr_t ac_meter_attr_default={
    /////无报警信息
    // .data.alarm.bit={
    //     .en  = 1,
    // },

/////------测试数据-------------------------
    .data.Irms_A = 10728, 
    .data.Urms_A = 2201, 
    .data.Uab = 3801, 

/////------56H	版本号‘V’--------------
    .info.soft_ver="sV3.4",
    .info.hard_ver="hV3.4",// 

    .info.product_model="AMC96-E3/KC",       //AMC96-E3/KC
    .info.production_info="rs485-meter",    //// 485型
    .info.manufacturer="Acrel",     //


    .config={//default value, do not delete

 //      .alarm_enable.bit={    /////报警使能无效
 //          .en  = 1,
 //         },

        .CT  = 1,
        .PT  = 1,       
       .addr    = 1,
       .channel = dev_chan_485_2,

    },


};






/**
 * @brief 
 * 
 */
void ac_meter_param_init(void)
{
 #if 0   
    snprintf(ac_meter_attr.info.soft_ver, sizeof(ac_meter_attr.info.soft_ver),"%s sv%04X %s",SDK_VER_STR,app_get_ver(),__DATE__);
    snprintf(ac_meter_attr.info.hard_ver, sizeof(ac_meter_attr.info.hard_ver),"%s",HARDWARE_STR);
    snprintf(ac_meter_attr.info.production_info, sizeof(ac_meter_attr.info.production_info),"%s","2024-08-p01");
#endif

}



//还需要检测配置参数是否合理----设备地址，通道编号---量程
uint8_t ac_meter_add_obj(uint8_t idx,uint8_t channel,uint8_t addr)
{

//还需要检测配置参数是否合理----设备地址，通道编号---量程
//  ac_meter_max_scale_0_01mm   (100000U)    //1000mm===1000x100 (0.01mm)

    LOG_NAME();

   if( (addr>ac_meter_max_dev_addr) || (channel>ac_meter_max_channel) )
   {
        return 0;
   }



    ac_meter_attr_default.config.addr    = addr;
    ac_meter_attr_default.config.channel = channel;

    ac_meter_set_obj( idx, (ac_meter_attr_t*)&ac_meter_attr_default ) ; 

 return 1;

}




/**
 * @brief 根据下标，获取iot_id 的编号
 * 
 * @param idx 
 */
uint16_t  ac_meter_get_iot_id(uint8_t idx)
{
    return  ac_meter_iot_id_table[idx] ;
}




/**
 * @brief 
 * 
 * @param in idx 
 * @return ac_meter_attr_t ==NULL 查询出错,   !NULL 查询ok
 */
ac_meter_attr_t*  ac_meter_get_obj(uint8_t idx)   
{
    return  &ac_meter_obj[idx];
}



/**
 * @brief ac_meter_set_obj() 赋值节点数据
 * 
 * @param in idx
 * @param in p_attr
 * @return 0=失败，1=成功 
 */
uint8_t  ac_meter_set_obj(uint8_t idx,ac_meter_attr_t* p_attr )  
{
    if( idx>=AC_METER_NODE_NUM_MAX )
    {
        return 0;
    } 

    ac_meter_obj[idx] = *p_attr;

 return 1 ;

}




/**
 * @brief 
 * 
 * @param attr_id 
 * @param attr_out 
 */
void ac_meter_get_attr(uint8_t idx,uint16_t attr_id, IotModel* attr_out)
{
    attr_out->iot_id = attr_id;//传给服务器
    

    if( idx > AC_METER_NODE_NUM_MAX )
    {
       logout("error:ac_meter idx outof range\n"); 
       return ;
    }                       
                       

    switch(attr_id)
    {
        //////---------RO--------------------------//////////////////////

        case 0x0400 :  //A相电压	RO	否	运行参数	uint16_t		0.1V
        {
           attr_out->value = ac_meter_obj[idx].data.Urms_A;
        } break;
        case 0x0401 :  //B相电压	RO	否	运行参数	uint16_t		0.1V
        {
           attr_out->value = ac_meter_obj[idx].data.Urms_B;
        } break;
        case 0x0402 :  //C相电压	RO	否	运行参数	uint16_t		0.1V
        {
           attr_out->value = ac_meter_obj[idx].data.Urms_C;
        } break;
        case 0x0403 :  //A相电流	RO	否	运行参数	uint16_t		0.01A
        {
           attr_out->value = ac_meter_obj[idx].data.Irms_A;
        } break;
        case 0x0404 :  //B相电流	RO	否	运行参数	uint16_t		0.01A
        {
           attr_out->value = ac_meter_obj[idx].data.Irms_B;
        } break;
        case 0x0405 :  //C相电流	RO	否	运行参数	uint16_t		0.01A
        {
           attr_out->value = ac_meter_obj[idx].data.Irms_C;
        } break;
        case 0x0407 :  //漏电电流	RO	否	运行参数	uint16_t		1mA
        {
          attr_out->value = ac_meter_obj[idx].data.Ileak;
        } break;
        case 0x0408 :  //频率	RO	否	运行参数	uint16_t		0.1Hz
        {
           attr_out->value = ac_meter_obj[idx].data.Freq;
        } break;
        case 0x0409 :  //总有功功率	RO	否	运行参数	uint32_t		1W
        {
          attr_out->value = ac_meter_obj[idx].data.Power_T;
        } break;
        case 0x040A :  //总功率因数	RO	否	运行参数	uint8_t	0~100	
        {
           attr_out->value = ac_meter_obj[idx].data.PF_T;
        } break;
        case 0x040B :  //总有功电能	R/W	否	运行参数	uint32_t		0.01kWh
        {
          attr_out->value = ac_meter_obj[idx].data.EnergyP_T;
        } break;
        case 0x040C :  //A相有功功率	RO	否	运行参数	uint16_t		1W
        {
          attr_out->value = ac_meter_obj[idx].data.Power_A;
        } break;
        case 0x040D :  //B相有功功率	RO	否	运行参数	uint16_t		1W
        {
          attr_out->value = ac_meter_obj[idx].data.Power_B;
        } break;
        case 0x040E :  //C相有功功率	RO	否	运行参数	uint16_t		1W
        {
           attr_out->value = ac_meter_obj[idx].data.Power_C;
        } break;
        case 0x040F :  //A相功率因数	RO	否	运行参数	uint8_t	0~100	
        {
           attr_out->value = ac_meter_obj[idx].data.PF_A;
        } break;
        case 0x0410 :  //B相功率因数	RO	否	运行参数	uint8_t	0~100	
        {
           attr_out->value = ac_meter_obj[idx].data.PF_B;
        } break;
        case 0x0411 :  //C相功率因数	RO	否	运行参数	uint8_t	0~100	
        {
           attr_out->value = ac_meter_obj[idx].data.PF_C;
        } break;
        case 0x0412 :  //A相有功电能	R/W	否	运行参数	uint32_t		0.01kWh
        {
           attr_out->value = ac_meter_obj[idx].data.EnergyP_A;
        } break;
        case 0x0413 :  //B相有功电能	R/W	否	运行参数	uint32_t		0.01kWh
        {
           attr_out->value = ac_meter_obj[idx].data.EnergyP_B;
        } break;
        case 0x0414 :  //C相有功电能	R/W	否	运行参数	uint32_t		0.01kWh            
        {
           attr_out->value = ac_meter_obj[idx].data.EnergyP_C;
        } break;
        case 0x0415 :  //线电压UAB	RO	否	运行参数	uint16_t		0.1V
        {
           attr_out->value = ac_meter_obj[idx].data.Uab;
        } break;
        case 0x0416 :  //线电压UBC	RO	否	运行参数	uint16_t		0.1V
        {
           attr_out->value = ac_meter_obj[idx].data.Ubc;
        } break;
        case 0x0417 :  //线电压UAC	RO	否	运行参数	uint16_t		0.1V
        {
           attr_out->value = ac_meter_obj[idx].data.Uca;
        } break;
        case 0x0418 :  //A相无功功率	RO	否	运行参数	uint16_t		var
        {
           attr_out->value = ac_meter_obj[idx].data.Qa;
        } break;
        case 0x0419 :  //B相无功功率	RO	否	运行参数	uint16_t		var
        {
           attr_out->value = ac_meter_obj[idx].data.Qb;
        } break;
        case 0x041A :  //C相无功功率	RO	否	运行参数	uint16_t		var
        {
           attr_out->value = ac_meter_obj[idx].data.Qc;
        } break;
        case 0x041B :  //总无功功率	RO	否	运行参数	uint16_t		var
        {
           attr_out->value = ac_meter_obj[idx].data.Qt;
        } break;
        case 0x041C :  //A相视在功率	RO	否	运行参数	uint16_t		VA
        {
           attr_out->value = ac_meter_obj[idx].data.Sa;
        } break;
        case 0x041D :  //B相视在功率	RO	否	运行参数	uint16_t		VA
        {
           attr_out->value = ac_meter_obj[idx].data.Sb;
        } break;
        case 0x041E :  //C相视在功率	RO	否	运行参数	uint16_t		VA
        {
           attr_out->value = ac_meter_obj[idx].data.Sc;
        } break;
        case 0x041F :  //总视在功率	RO	否	运行参数	uint16_t		VA		
        {
           attr_out->value = ac_meter_obj[idx].data.St;
        } break;
        case 0x0420 :  //总无功电能	R/W	否	运行参数	uint32_t		0.01kWh
        {
           attr_out->value = ac_meter_obj[idx].data.EnergyQ_T;
        } break;
                        
   
    ///-------交流电表物模型-v1.2--------------

      case 0x0421 :  // 0x0421	1057	报警信息"0=正常，1=告警
      {
         attr_out->value = ac_meter_obj[idx].data.alarm.value;
      } break;
    ///-------交流电表物模型-v1.2--------------
       


       // case 0x0421:  //DI	R/W		运行参数	uint16_t	
        case 0x0541:
        {    
            attr_out->value = ac_meter_obj[idx].data.DI ;
        }  break;

        case 0x0422:  //DO	R/W		运行参数	uint16_t	
        {    
            attr_out->value = ac_meter_obj[idx].data.DO ;
        }  break;

        //////---------R/W--------------------------//////////////////////



        case 0x0010:  //do1	R/W		运行参数	uint16_t	
        {    
            attr_out->value = ac_meter_obj[idx].config.do1 ;
        }  break;

        case 0x0011:  //do2	R/W		运行参数	uint16_t	
        {    
            attr_out->value = ac_meter_obj[idx].config.do2  ;
        }  break;

    ///-------交流电表物模型-v1.2--------------
//   0x0440	1088	pulseConst	电能脉冲常数	R/W	否	配置信息	uint16_t	16-1600	100imp/kWh		默认值100 pulse
//   0x0441	1089	almEn;	报警使能	R/W	 "0=不启用，1=启用  
//   0x0442	,//电压变比PT	R/W		配置信息	uint16_t		
//   0x0443	,//电流变比CT	R/W		配置信息	uint16_t		

        case 0x0440:
        {
           attr_out->value = ac_meter_obj[idx].config.pulseConst;
        }  break;
        
        case 0x0441:
        {
           attr_out->value = ac_meter_obj[idx].config.almEn.value ;
        }  break;
        
        
        case 0x0442:
        {
           attr_out->value = ac_meter_obj[idx].config.PT ;
        }  break;
        
        case 0x0443:
        {
           attr_out->value = ac_meter_obj[idx].config.CT ;
        }  break;
        


      ///-------交流电表物模型-v1.4--------------
         case 0x0470:
         {
            attr_out->value = ac_meter_obj[idx].config.thVoltHi;
         }  break;

         case 0x0471:
         {
            attr_out->value = ac_meter_obj[idx].config.thVoltLow;
         }  break;

         case 0x0472:
         {
            attr_out->value = ac_meter_obj[idx].config.thFreqHi;
         }  break;
         
         case 0x0473:
         {
            attr_out->value = ac_meter_obj[idx].config.thFreqLow;
         }  break;

         case 0x0474:
         {
            attr_out->value = ac_meter_obj[idx].config.thPowerHi;
         }  break;
         
         case 0x0475:
         {
            attr_out->value = ac_meter_obj[idx].config.thPowerLow;
         }  break;

         case 0x0476:
         {
            attr_out->value = ac_meter_obj[idx].config.thCurrHi;
         }  break;
         
         case 0x0477:
         {
            attr_out->value = ac_meter_obj[idx].config.thCurrLow;
         }  break;



// 0x0801	软件版本
// 0x0802	硬件版本
// 0x0803	产品型号
// 0x0804	生产信息
// 0x0805	厂家信息

        //////---------RO--------------------------//////////////////////
        // case 0x0800://0x0800	产品类型	RO	否	产品类型	uint16_t
        // {
        //     attr_out->value = CTK_PID;
        // }  break;

        case 0x0801:
        {
            attr_out->values.size = strlen(ac_meter_obj[idx].info.soft_ver);
            strncpy((char*)attr_out->values.bytes,ac_meter_obj[idx].info.soft_ver,32);
        }  break;
        case 0x0802:
        {
            attr_out->values.size = strlen(ac_meter_obj[idx].info.hard_ver);
            strncpy((char*)attr_out->values.bytes,ac_meter_obj[idx].info.hard_ver,32);
        }  break;

        case 0x0803:
        {
            attr_out->values.size = strlen(ac_meter_obj[idx].info.product_model);
            strncpy((char*)attr_out->values.bytes,ac_meter_obj[idx].info.product_model,32);
        }  break;

        case 0x0804:
        {
            attr_out->values.size = strlen(ac_meter_obj[idx].info.production_info);
            strncpy((char*)attr_out->values.bytes,ac_meter_obj[idx].info.production_info,32);
        }  break;

        case 0x0805:
        {
            attr_out->values.size = strlen(ac_meter_obj[idx].info.manufacturer);
            strncpy((char*)attr_out->values.bytes,ac_meter_obj[idx].info.manufacturer,32);
        }  break;
        //////---------RO--------------------------//////////////////////


       default: 
           break;

    }

}




/**
 * @brief 
 * 
 * @param attr_in 
 * @return uint8_t 
 */
uint8_t ac_meter_set_attr(uint8_t idx,IotModel* attr)
{
uint8_t ret  = 0;

//dev_mod_info_t info;


    //printf_log(lv0,"set addr %04X, value = %d\n", attr->iot_id, attr->value);////printf_log

    logout("set addr %04X, value = %lu\n", attr->iot_id, attr->value);

    if( idx > AC_METER_NODE_NUM_MAX )
    {
       logout("error:ac_meter idx outof range\n"); 
       return 0;
    }

   //  memset((uint8_t*)&info,0,sizeof(dev_mod_info_t ) );

    // info.node_type = 1;
    // info.channel   = 2;
    // info.chan_addr = 1;

 //    iot_get_mod_info_with_index( idx ,&info);
//got info: chan_addr=1,channel=2,node_type=53254,indx=1
  // info.node_type = 1;

    switch( attr->iot_id )
    {

        //////--------对与上行是只读-RO-----------对与下行是只写-WO--------------------//////////////////////

        //////---------RO--------------------------//////////////////////

        case 0x0400 :  //A相电压	RO	否	运行参数	uint16_t		0.1V
        {
           ac_meter_obj[idx].data.Urms_A = attr->value;
        } break;
        case 0x0401 :  //B相电压	RO	否	运行参数	uint16_t		0.1V
        {
           ac_meter_obj[idx].data.Urms_B = attr->value;
        } break;
        case 0x0402 :  //C相电压	RO	否	运行参数	uint16_t		0.1V
        {
           ac_meter_obj[idx].data.Urms_C = attr->value;
        } break;
        case 0x0403 :  //A相电流	RO	否	运行参数	uint16_t		0.01A
        {
           ac_meter_obj[idx].data.Irms_A = attr->value;
        } break;
        case 0x0404 :  //B相电流	RO	否	运行参数	uint16_t		0.01A
        {
           ac_meter_obj[idx].data.Irms_B = attr->value;
        } break;
        case 0x0405 :  //C相电流	RO	否	运行参数	uint16_t		0.01A
        {
           ac_meter_obj[idx].data.Irms_C = attr->value;
        } break;
        case 0x0407 :  //漏电电流	RO	否	运行参数	uint16_t		1mA
        {
          ac_meter_obj[idx].data.Ileak = attr->value;
        } break;
        case 0x0408 :  //频率	RO	否	运行参数	uint16_t		0.1Hz
        {
           ac_meter_obj[idx].data.Freq = attr->value;
        } break;
        case 0x0409 :  //总有功功率	RO	否	运行参数	uint32_t		1W
        {
          ac_meter_obj[idx].data.Power_T = attr->value;
        } break;
        case 0x040A :  //总功率因数	RO	否	运行参数	uint8_t	0~100	
        {
           ac_meter_obj[idx].data.PF_T = attr->value;
        } break;
        case 0x040B :  //总有功电能	R/W	否	运行参数	uint32_t		0.01kWh
        {
          ac_meter_obj[idx].data.EnergyP_T = attr->value;
        } break;
        case 0x040C :  //A相有功功率	RO	否	运行参数	uint16_t		1W
        {
          ac_meter_obj[idx].data.Power_A = attr->value;
        } break;
        case 0x040D :  //B相有功功率	RO	否	运行参数	uint16_t		1W
        {
          ac_meter_obj[idx].data.Power_B = attr->value;
        } break;
        case 0x040E :  //C相有功功率	RO	否	运行参数	uint16_t		1W
        {
           ac_meter_obj[idx].data.Power_C = attr->value;
        } break;
        case 0x040F :  //A相功率因数	RO	否	运行参数	uint8_t	0~100	
        {
           ac_meter_obj[idx].data.PF_A = attr->value;
        } break;
        case 0x0410 :  //B相功率因数	RO	否	运行参数	uint8_t	0~100	
        {
           ac_meter_obj[idx].data.PF_B = attr->value;
        } break;
        case 0x0411 :  //C相功率因数	RO	否	运行参数	uint8_t	0~100	
        {
           ac_meter_obj[idx].data.PF_C = attr->value;
        } break;
        case 0x0412 :  //A相有功电能	R/W	否	运行参数	uint32_t		0.01kWh
        {
           ac_meter_obj[idx].data.EnergyP_A = attr->value;
        } break;
        case 0x0413 :  //B相有功电能	R/W	否	运行参数	uint32_t		0.01kWh
        {
           ac_meter_obj[idx].data.EnergyP_B = attr->value;
        } break;
        case 0x0414 :  //C相有功电能	R/W	否	运行参数	uint32_t		0.01kWh            
        {
           ac_meter_obj[idx].data.EnergyP_C = attr->value;
        } break;
        case 0x0415 :  //线电压UAB	RO	否	运行参数	uint16_t		0.1V
        {
           ac_meter_obj[idx].data.Uab = attr->value;
        } break;
        case 0x0416 :  //线电压UBC	RO	否	运行参数	uint16_t		0.1V
        {
           ac_meter_obj[idx].data.Ubc = attr->value;
        } break;
        case 0x0417 :  //线电压UAC	RO	否	运行参数	uint16_t		0.1V
        {
           ac_meter_obj[idx].data.Uca = attr->value;
        } break;
        case 0x0418 :  //A相无功功率	RO	否	运行参数	uint16_t		var
        {
           ac_meter_obj[idx].data.Qa = attr->value;
        } break;
        case 0x0419 :  //B相无功功率	RO	否	运行参数	uint16_t		var
        {
           ac_meter_obj[idx].data.Qb = attr->value;
        } break;
        case 0x041A :  //C相无功功率	RO	否	运行参数	uint16_t		var
        {
           ac_meter_obj[idx].data.Qc = attr->value;
        } break;
        case 0x041B :  //总无功功率	RO	否	运行参数	uint16_t		var
        {
           ac_meter_obj[idx].data.Qt = attr->value;
        } break;
        case 0x041C :  //A相视在功率	RO	否	运行参数	uint16_t		VA
        {
           ac_meter_obj[idx].data.Sa = attr->value;
        } break;
        case 0x041D :  //B相视在功率	RO	否	运行参数	uint16_t		VA
        {
           ac_meter_obj[idx].data.Sb = attr->value;
        } break;
        case 0x041E :  //C相视在功率	RO	否	运行参数	uint16_t		VA
        {
           ac_meter_obj[idx].data.Sc = attr->value;
        } break;
        case 0x041F :  //总视在功率	RO	否	运行参数	uint16_t		VA		
        {
           ac_meter_obj[idx].data.St = attr->value;
        } break;
        case 0x0420 :  //总无功电能	R/W	否	运行参数	uint32_t		0.01kWh
        {
           ac_meter_obj[idx].data.EnergyQ_T = attr->value;
        } break;
                        
   
   
    ///-------交流电表物模型-v1.2--------------

      case 0x0421 :  // 0x0421	1057	报警信息"0=正常，1=告警
      {
         ac_meter_obj[idx].data.alarm.value  = attr->value;
      } break;
  ///-------交流电表物模型-v1.2--------------
     


       // case 0x0421:  //DI	R/W		运行参数	uint16_t	
        case 0x0541:     
        {    
            ac_meter_obj[idx].data.DI  = attr->value;
        }  break;

        case 0x0422:  //DO	R/W		运行参数	uint16_t	
        {    
            ac_meter_obj[idx].data.DO  = attr->value;
        }  break;


        //////---------RO--------------------------//////////////////////

        //////---------R/W--------------------------//////////////////////
        case 0x0600:
        {
            ac_meter_obj[idx].config.addr = attr->value;   /////还需要保存
           // ret  = iot_Node_WriteSensor_one(  1,  0x12, 4,  attr->iot_id,  attr->value);
            ret  = 1;
        }  break;

        case 0x0602://0x0602	烟雾设备通道编号
        {
            ac_meter_obj[idx].config.channel = attr->value;

           // ret  = iot_Node_WriteSensor_one(  1,  0x12, 4,  attr->iot_id,  attr->value);
             //ret  = json_write_setAttr_dev( &info,"oilLevel_2_1","mbAddr" ,  attr->value );
            ret  = 1;
        }  break;


    //配置参数	
      case 0x0010:  //do1	R/W		运行参数	uint16_t	
      {    
         ac_meter_obj[idx].config.do1 = attr->value;
      }  break;

      case 0x0011:  //do2	R/W		运行参数	uint16_t	
      {    
         ac_meter_obj[idx].config.do2 = attr->value;
      }  break;

    ///-------交流电表物模型-v1.2--------------
//   0x0440	1088	pulseConst	电能脉冲常数	R/W	否	配置信息	uint16_t	16-1600	100imp/kWh		默认值100 pulse
//   0x0441	1089	alarm_enable;	报警使能	R/W	 "0=不启用，1=启用  
//   0x0442	,//电压变比PT	R/W		配置信息	uint16_t		
//   0x0443	,//电流变比CT	R/W		配置信息	uint16_t		 

      case 0x0440:
      {
         ac_meter_obj[idx].config.pulseConst= attr->value;
      }  break;

      case 0x0441:
      {
         ac_meter_obj[idx].config.almEn.value = attr->value;
      }  break;


      case 0x0442:
      {
         ac_meter_obj[idx].config.PT = attr->value;
      }  break;

      case 0x0443:
      {
         ac_meter_obj[idx].config.CT = attr->value;
      }  break;


///-------交流电表物模型-v1.4--------------
   

      case 0x0470:
      {
         ac_meter_obj[idx].config.thVoltHi= attr->value;
      }  break;

      case 0x0471:
      {
         ac_meter_obj[idx].config.thVoltLow= attr->value;
      }  break;

      case 0x0472:
      {
         ac_meter_obj[idx].config.thFreqHi= attr->value;
      }  break;
      
      case 0x0473:
      {
         ac_meter_obj[idx].config.thFreqLow= attr->value;
      }  break;

      case 0x0474:
      {
         ac_meter_obj[idx].config.thPowerHi= attr->value;
      }  break;
      
      case 0x0475:
      {
         ac_meter_obj[idx].config.thPowerLow= attr->value;
      }  break;

      case 0x0476:
      {
         ac_meter_obj[idx].config.thCurrHi= attr->value;
      }  break;
      
      case 0x0477:
      {
         ac_meter_obj[idx].config.thCurrLow= attr->value;
      }  break;

        //////---------R/W--------------------------//////////////////////

       default: 
           break;

    }

 return ret;

}



#define  ac_meter_scale_step           (25U)

void ac_meter_test_tick_min(uint8_t idx)
{
static uint32_t cnt = 0;
  IotModel attr;
    memset(&attr, 0,  sizeof(IotModel) );

   LOG_NAME();
/////------测试数据-------------------------
    // .data.level_mm = 50728, //0.01mm
    // .data.temper   = 37,    //温度  1℃ 


// 0x0500	烟雾报警信息
    attr.iot_id =0x0500;
    attr.value =0x0000;
    ac_meter_set_attr(idx, &attr); 


// 0x0501	烟雾
    attr.iot_id =0x0501;

   if(cnt < ac_meter_max_scale_0_01mm/ac_meter_scale_step)
   {
       attr.value = ac_meter_max_scale_0_01mm - ac_meter_scale_step*cnt;
   }else{
       attr.value = 0;
   }


    ac_meter_set_attr(idx, &attr); 


// 0x0030	温度
    attr.iot_id =0x0030;
    attr.value = 20 + (cnt&0x0F);
    ac_meter_set_attr(idx, &attr); 
 
    cnt++;

}




//void ac_meter_update_tick_min(uint8_t idx,uint8_t pattr_size,IotModel* pattr )
////刷新节点运行数据
void ac_meter_update_tick_min(uint8_t idx,int8_t temper ,uint32_t ac_meter )
{
  IotModel attr;
  memset(&attr, 0,  sizeof(IotModel) );

   LOG_NAME();



    if( idx > AC_METER_NODE_NUM_MAX )
    {
       logout("error:ac_meter idx outof range\n"); 
       return ;
    }



/*---------这里添加报警逻辑------------------------
#if 0
ac_meter_attr_t*  pattr=ac_meter_get_obj( idx) ; 


  
// 0x0500	烟雾报警信息
    // attr.iot_id =0x0500;
    // attr.value =0x0000;
    // ac_meter_set_attr(idx, &attr); 

//---------这里添加报警逻辑------------------------

    if( temper>=pattr->config.over_temper_th )
    {
        pattr->data.alarm.bit.over_temper = 1;

    }else if( temper<=pattr->config.under_temper_th )
    {
        pattr->data.alarm.bit.under_temper = 1;
            
    }else{
        pattr->data.alarm.bit.over_temper  = 0;
        pattr->data.alarm.bit.under_temper = 0;
    }


    if( ac_meter>=pattr->config.over_level_th )
    {
        pattr->data.alarm.bit.over_level = 1;

    }else if( ac_meter<=pattr->config.under_level_th )
    {
        pattr->data.alarm.bit.under_level = 1;
            
    }else{
        pattr->data.alarm.bit.over_level  = 0;
        pattr->data.alarm.bit.under_level = 0;
    }

   pattr = NULL;   

#endif

---------这里添加报警逻辑------------------------*/



// 0x0501	烟雾
    attr.iot_id =0x0501;
    attr.value = ac_meter;
    ac_meter_set_attr(idx, &attr); 


// 0x0030	温度
    attr.iot_id =0x0030;
    attr.value  = temper;////负温度的时候有问题----还需要进一步处理
    ac_meter_set_attr(idx, &attr); 
 
}







////刷新节点运行数据
void ac_meter_obj_update(uint8_t idx,ac_meter_attr_t* pliq_in  )
{
  IotModel attr;
  memset(&attr, 0,  sizeof(IotModel) );

   LOG_NAME();

    if( idx > AC_METER_NODE_NUM_MAX )
    {
       logout("error:ac_meter idx outof range\n"); 
       return ;
    }


    if( NULL==pliq_in )
    {
       logout("error:pliq_in==NULL\n"); 
       return ;
    }



//#if 0
ac_meter_attr_t*  pattr=ac_meter_get_obj( idx) ; 

 ////-----保存节点数据到物模型------
      *pattr = *pliq_in;

 //-----同步节点数据到 白名单--------
   iot_set_device_online_state_with_index(idx,  pliq_in->flags.bit.online );   ////同步节点在线标志到 白名单-----

 //-----还有其它数据需要同步到 白名单----通道编号--通道地址???----





#if 0
// 0x0500	烟雾报警信息
    // attr.iot_id =0x0500;
    // attr.value =0x0000;
    // ac_meter_set_attr(idx, &attr); 

//---------这里添加报警逻辑------------------------

    if( temper>=pattr->config.over_temper_th )
    {
        pattr->data.alarm.bit.over_temper = 1;

    }else if( temper<=pattr->config.under_temper_th )
    {
        pattr->data.alarm.bit.under_temper = 1;
            
    }else{
        pattr->data.alarm.bit.over_temper  = 0;
        pattr->data.alarm.bit.under_temper = 0;
    }


    if( ac_meter>=pattr->config.over_level_th )
    {
        pattr->data.alarm.bit.over_level = 1;

    }else if( ac_meter<=pattr->config.under_level_th )
    {
        pattr->data.alarm.bit.under_level = 1;
            
    }else{
        pattr->data.alarm.bit.over_level  = 0;
        pattr->data.alarm.bit.under_level = 0;
    }

   pattr = NULL;   

//#endif


// 0x0501	烟雾
    attr.iot_id =0x0501;
    attr.value = ac_meter;
    ac_meter_set_attr(idx, &attr); 


// 0x0030	温度
    attr.iot_id =0x0030;
    attr.value  = temper;////负温度的时候有问题----还需要进一步处理
    ac_meter_set_attr(idx, &attr); 
 
#endif


}

















